package com.zcsy.manage.service.system.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import com.zcsy.commons.constants.Constants;
import com.zcsy.manage.model.system.Menu;
import com.zcsy.manage.model.system.User;
import com.zcsy.manage.persistence.system.MenuDao;
import com.zcsy.manage.service.common.CommonService;

/**
 * 
 * @Title: SystemComService.java
 * @Package： com.zcsy.shop.service.system.impl 
 * @Description:系统管理基类，service层继承使用
 * @author chensf 735569870@qq.com
 * @Copyright: 2015 武汉中财数元信息技术有限公司 All rights reserved.
 * @date 2016年1月7日
 * @version 1.0
 * @see JDK1.7.0_75
 * @since
 */
public class SystemComService extends CommonService{

    @Autowired
    private MenuDao menuDao;
    
    /**
     * 
     * @Description <br>
     * 返回第一个有效菜单
     * @param menus 有权限的所有菜单
     * @return 第一个有效菜单
     * @author chensf 735569870@qq.com
     * @date 2016年1月7日
     * @see
     */
    protected Menu getFirstAvailableMenus(List<Menu> menus) {
        Menu first = null;
        if (CollectionUtils.isNotEmpty(menus)) {
            for(Menu item : menus){
            	if(!CollectionUtils.isNotEmpty(item.getSubMenus())
            			&& !StringUtils.isEmpty(item.getLocationURL())){
            		return item;
            	}
            	
            	if(CollectionUtils.isNotEmpty(item.getSubMenus())){
            		return getFirstAvailableMenus(item.getSubMenus());
            	}
            }
        }
        
        return first;
    }
    
    /** 
     * @Title: getFirstAvailableRootMenus 
     * @Description: 获取第一个有子菜单的一级菜单信息
     * @param @param menus
     * @param @return     
     * @return Menu     
     * @throws 
     */
    protected Menu getFirstAvailableRootMenus(List<Menu> menus){
    	Menu first = null;
        if (CollectionUtils.isNotEmpty(menus)) {
            for(Menu item : menus){
            	if(!StringUtils.isEmpty(item.getLocationURL())){
            		return item;
            	}
            	
            	if(item.getSubMenus() != null 
            			&& ifAvailableMenus(item.getSubMenus())){
            		return item;
            	}
            }
        }
        
        return first;
    }
    
    private boolean ifAvailableMenus(List<Menu> menus) {
        boolean first = false;
        if (CollectionUtils.isNotEmpty(menus)) {
            for(Menu item : menus){
            	if(!CollectionUtils.isNotEmpty(item.getSubMenus())
            			&& !StringUtils.isEmpty(item.getLocationURL())){
            		return true;
            	}
            	
            	if(CollectionUtils.isNotEmpty(item.getSubMenus())){
            		return ifAvailableMenus(item.getSubMenus());
            	}
            }
        }
        
        return first;
    }
    
    /**
     * 
     * @Description <br>
     * 获取菜单的子菜单
     * @param allList 所有有权限的菜单
     * @return 子菜单集合
     * @author chensf 735569870@qq.com
     * @date 2016年1月7日
     * @see
     */
    private List<Menu> getSubMenus(List<Menu> allList){
        List<Menu> result = new ArrayList<Menu>();
        if(CollectionUtils.isNotEmpty(allList)){
            
            for(Menu menu:allList){
                if(menu.getMenuLevel() == Constants.MENU_LEVEL_FIREST){
                    
                    Menu head = getSubMenusByList(menu, allList);
                    result.add(head);
                }
            }
        }
        
        return result;
    }
    
    /**
     * 
     * @Description <br>
     * 从集合中选出该菜单的子菜单
     * @param menu 待设置子菜单的菜单
     * @param list 所有有权限 的菜单
     * @return 待设置子菜单的菜单
     * @author chensf 735569870@qq.com
     * @date 2016年1月7日
     * @see
     */
    private Menu getSubMenusByList(Menu menu,List<Menu> list){
        if(CollectionUtils.isNotEmpty(list)){
            List<Menu> subList = new ArrayList<Menu>();
            
            for(Menu sub:list){
                if(sub.getParentId().equals(menu.getId())){
                    
                    Menu subMenu = getSubMenusByList(sub, list);
                    subList.add(subMenu);
                }
            }
            
            menu.setSubMenus(subList);
        }
        
        return menu;
    }
    
    /**
     * 
     * @Description <br>
     * 从缓存中获取菜单列表，若缓存中没有菜单列表，则从数据库中获取，再放到缓存中去
     * @param user 用户
     * @return 菜单列表
     * @author chensf 735569870@qq.com
     * @date 2016年1月7日
     * @see
     */
    protected List<Menu> getMenusByComCache(User user , Integer type) {
        return getMenusByComCache(user, type, null);
    }
    
    /** 
     * @Title: getMenusByComCache 
     * @Description: 取用户对应的菜单列表
     * @param @param user
     * @param @param type
     * @param @param menuType
     * @param @return     
     * @return List<Menu>     
     * @throws 
     */
    protected List<Menu> getMenusByComCache(User user , Integer type , Integer menuType){
    	List<Menu> result = new ArrayList<Menu>();
        HashMap<String , Object> map = new HashMap<String , Object>();
        map.put("roleIds", user.getRoleCellList());
        map.put("system", type);
        if(menuType != null){
        	map.put("menuType", menuType);
        }
		map.put("type", Constants.MENU_TYPE);
        List<Menu> allMenu = menuDao.queryMenuByRoleIds(map);
        
        //当是运营选择小区时，需要加上有权限的平台菜单
//        if(type == Constants.SYSTEM_OPERATION_WEB
//        		&& user.getUserType() != Constants.ADMIN_TYPE){
//        	HashMap<String , Object> mapPerform = new HashMap<String , Object>();
//        	mapPerform.put("roleIds", user.getRoleList());
//        	mapPerform.put("menus", allMenu);
//        	mapPerform.put("system", type);
//        	
//        	List<Menu> paltformMenus = menuDao.queryPerformMenuByRoleIds(mapPerform);
//        	
//        	if(CollectionUtils.isNotEmpty(paltformMenus)){
//        		allMenu.addAll(paltformMenus);
//        		//重新排序
//            	Collections.sort(allMenu,new Comparator<Menu>(){
//                    public int compare(Menu arg0, Menu arg1) {
//                        return arg0.getMenuOrder().compareTo(arg1.getMenuOrder());
//                    }
//                });
//        	}
//        	
//        }
        
        
        
        result = getSubMenus(allMenu);
        
        return result;
    }
	
	
	protected String getBtnsByComCache(User user , Integer type){
        HashMap<String , Object> map = new HashMap<String , Object>();
        map.put("roleIds", user.getRoleCellList());
        map.put("system", type);
        map.put("type", Constants.BTN_TYPE);
        List<Menu> allMenu = menuDao.queryMenuByRoleIds(map);
        
        StringBuffer buffer = new StringBuffer();
        for(Menu item : allMenu){
        	buffer.append(item.getValue() + ",");
        }
        
        if(buffer.length() > 0){
        	return buffer.substring(0, buffer.length() - 1);
        }
        
        return "";
    }
    
    
    /**
     * 
     * 缓存中获取菜单数组列表，若缓存中没有菜单列表，则从数据库中获取，再放到缓存中去
     * @param user
     * @return
     */
    protected List<Menu> getMenusArrayByComCache(User user,Integer type) {
        return getMenusArrayByComCache(user, type, null);
    }
    
    protected List<Menu> getMenusArrayByComCache(User user,Integer type , Integer menuType) {
		List<Menu> result = new ArrayList<Menu>();
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("roleIds", user.getRoleCellList());
		map.put("system", type);
		if(menuType != null){
        	map.put("menuType", menuType);
        }
		map.put("type", Constants.MENU_TYPE);
		result = menuDao.queryMenuByRoleIds(map);
        
        return result;
        
    }
}
